#include <stdio.h>
#include<string.h>
#include<errno.h>
#include<stdlib.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/wait.h>
//非阻塞状态
typedef void (*func_t)();//函数指针类型

#define NUM 5
func_t handlers[NUM+1];

//如一下任务
void DownLoad()
{
    printf("我是一个下载的任务。。。");
}

void Flush()
{
    printf("我是一个刷新的任务。。。");
}

void Log()
{
    printf("我是一个记录日志的任务。。。");
}

void registerHandler(func_t h[], func_t f)
{
    int i = 0;
    for(; i < NUM; i++)
    {
        if(h[i] == NULL) break;
    }
    if(i == NUM) return ;
    h[i] = f;
    h[i+1] = NULL;
}

int main()
{
    registerHandler(handlers, DownLoad);
    registerHandler(handlers, Flush);
    //registerHandler(handlers, Log);
    pid_t id = fork();
    if(id == 0)
    {
        int cnt = 3;
        while(cnt)
        {
            cnt--;
            //sleep(3);
            printf("我是一个子进程，pid：%d， ppid：%d\n", getpid(), getppid());
            sleep(1);
        }
        exit(10);
    }
    
    //父进程
    else
    {
        while(1)
    {
        int status = 1;
        pid_t rid = waitpid(id, &status, WNOHANG);
        if(rid > 0)
        {
            printf("wait success, rid: %d, exit code: %d, exit signal: %d\n", rid, (status>>8)&0xFF, status&0x7F);
            break;
        }
        else if(rid == 0)
        {
            //printf("本轮调用结束，子进程没有退出\n");
            int i = 0;
            for(; handlers[i]; i++)
            {
                handlers[i]();
            }
            
            printf("本轮调用结束，子进程没有退出\n");
            sleep(1);
        }
        else
        {
            printf("等待失败\n");
            break;
        }
    }
    }

    return 0;
}


//z阻塞状态pid_t rid = waitpid(id, &status, 0);
//int main(9)
//{
//    pid_t id = fork();
//    if(id == 0)
//    {
//        //子进程
//        int cnt = 20;
//        while(cnt)
//        {
//            printf("我是子进程，pid：%d， ppid：%d\n", getpid(), getppid());
//            sleep(1);
//            cnt--;
//            //int *p = 1;
//            //*p = 100;
//        }
//        exit(0);
//    }
//    sleep(6);
//    //父进程
//    //1.子进程退出
//    //2.子进程没退出
//    //pid_t rid = wait(NULL);
//    int status = 0;
//    pid_t rid = waitpid(id, &status, 0);
//    if(id > 0)
//    {
//        //printf("wait success, rid: %d, exit code: %d, exit signal: %d\n", rid, (status>>8)&0xFF, status&0x7F);
//    if(WIFEXITED(status))
//        printf("wait success, rid: %d, exit code: %d, exit signal: %d\n", rid, WEXITSTATUS(status), status&0x7F);
//    else
//        printf("子进程退出异常!\n");
//    }
//    else
//    {
//        printf("wait failed: %d: %s\n", errno, strerror(errno));
//    }
//
//
//    return 0;
//}





//void fun()
//{
//    printf("fun begin!\n");
//    exit(30);
//    printf("fun end!\n");
//
//}

//int main()
//{
//    fun();
//    printf("main!\n");





    
 //   int i = 0;
 //   for(; i < 200; i++)
 //   {
 //       printf("%d->%s\n", i, strerror(i));
 //   }


 //   FILE *fp = fopen("log.txt", "r");
 //   if(fp == NULL) return 13;



    //printf("Hello world\n");

    //FILE *fp = fopen("log.txt", "r");
    //if(fp == NULL) return 1;
    //fclose(fp);
    //return 0;
//}

